#ifndef GA_H
#define GA_H

/* SYSTEM */
#define GD                            // 是否是在板上运行
#define USE_TRNG                      // 是否使用硬件随机数发生器
// #define DEBUG                      // debug 输出

/* RIS */
#define NY                  4           //列数
#define NZ                  4           //行数
#define ROW_LENGTH          8           //一列的位数
#define Lambda              (3 / 26)    //波长  c = 3e8  f = 2.6e9
#define READ_DELAY          500        //ris状态变化后 延迟读取的时间 ms 2200

/* GA */
#define LENGTH              32          //染色体长度 2bits NY*NZ*2
// #define RAND_RANGE		    65536       //Length:16  2^32
#define RAND_RANGE		    	256         //row 4  2^8
#define POP_SIZE            100          //种群大小
#define K                   100					//17          //累计概率平衡 <0 exp >=0差值+K
#define MAX_GENERATION      50 		    //迭代次数上限
#define DIFF                0.001       // 提前退出 前后两次比较的差值
#define DIFF_COUNT          15          // 小差值次数
#define USE_MYQSORT

/* */
#define P_CROSSOVER         0.8         //交配概率 0为取一个位置交叉后面的部分 其他为按概率无限交换，一次交换连续的两个
#define P_MUTATION          0.8    // 0.3         //突变概率 提高会增大迭代次数
#define RETENTION_RATION    0.2 // 0.28        //保留比例 减小可以减少迭代次数  *POP_SIZE 需要为偶数

/* codebook initial */
#define A_A                 0          //角度码本方位角个数
#define P_A                 0          //角度码本俯仰角个数
#define DFT                 0           //是否使用DFT初始化


struct GATargetFunc
{
    void (*send)(unsigned char*);
    void (*delay)(unsigned int);
    int (*get)(void);
		int (*print)(const char *, ...);
    int* stop;
};

// int ref[4] = {exp(1i*pi*1/2), exp(1i*pi), exp(1i*pi*3/2), exp(1i*pi*2)};  //可用状态 2bits

unsigned char* GA(unsigned char*);
int GATargetFuncRegister(const struct GATargetFunc *drv);

// extern void ga_print(const char *str, ...);

#endif /* GA */
